package cn.tedu.v4;

/**
 * Version 4 消息转发
 *   功能：一个客户端发送给服务器文本，转发至其他客户端
 *   客户端  多线程 ×
 *   服务器  多线程 √  只加一个多线程，替换 消息转发 方案
 *   --------------------------------------------------
 *   多线程并发安全问题：
 *   当多个线程并发操作同一个资源时，由于线程切换时间不确定【CPU时间片获取线程实际不确定】，可能导致代码执行混乱或者进入正确状态，程序
 *   出现错误，更严重情况软件瘫痪
 *
 *   synchronized 多线程关键字  同步锁
 *
 *   语法情景1：同步块方式
 *   语法：synchronized(同步监视对象){
 *
 *   }
 *   语法情景2：同步方法方式
 *   语法：public synchronized void method(){
 *
 *   }
 *   同步机制：可以控制线程执行顺序，避免线程键切换冲突
 *   异步机制：不控制线程执行顺序，执行两套功能顺序
 *
 *   案例：去WC流程，创建两个线程，两个人取厕所
 */
public class Thread_syn {
    public static void main(String[] args) {
        //创建WC
        WC wc=new WC();
        //创建两个线程
        Thread p1=new Thread(()->{wc.go();});
        Thread p2=new Thread(()->{wc.go();});
        //统一启动
        p1.start();
        p2.start();
    }
}
//创建WC
class WC{
    public void go(){//去WC
        Thread t=Thread.currentThread();//获取线程的实例：Thread[main,5,main]
        System.out.println(t.getName()+"去厕所....");
        try {   //this  指代当前线程---哪条线程先被CPU时间片选中，先被执行
            synchronized (this) {//监视同步的对象：先来线程，立即确定加锁！
                Thread.sleep(5000);
                System.out.println(t.getName()+"找门进去....");
            }
            Thread.sleep(3000);
            System.out.println(t.getName()+"提裤子走人");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}